Spring MVC中控制器的测试
目的是在不启动WEB容器的情况下,对我们开发的控制器进行单行测试。
Spring测试框架提供了 MockMvc 类,这个类是Spring mvc框架对控制器做测试的主要入口。
步骤
编写一个测试类,打上 @ContextConfiguration注解和@RunWith注解,另外再加一个 @WebAppCofigruation注解
1
2
3
4
5
6(classes = WebMvcConfig.class)
(SpringJUnit4ClassRunner.class)
//是为了让spring测试框架注入 WebApplicationContext对象
public class BaseControllerTests {
//...
}
在测试类中,构建 MockMvc 对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19(classes = WebMvcConfig.class)
(SpringJUnit4ClassRunner.class)
//是为了让spring测试框架注入 WebApplicationContext对象
public class BaseControllerTests {
private WebApplicationContext wac;
protected MockMvc mockMvc;
public void initMockMvc() {
//初始化MockMvc
this.mockMvc = webAppContextSetup(wac).build();
//如果针对单个控制器的测试
/*EmployeeController ec = new EmployeeController();
this.mockMvc = standaloneSetup(ec).build();*/
}
}
利用MockMvc执行各种不同的请求【GET, POST, DELETE, PUT, PATCH, …】
1
2
3
4
5
6
7
8
9
10public class UserRestControllerTest extends BaseControllerTests {
public void testgetUsers() throws Exception {
MvcResult mvcResult = mockMvc.perform(get("/v1/api/users"))
.andExpect(status().is(200))
.andReturn();
System.out.println(mvcResult.getResponse().getContentAsString());
}
}
根据响应进行断言
1
2
3
4
5
6
7
8
9
10
11
12
public void testgetEmployee() throws Exception {
//
MvcResult mvcResult = mockMvc.perform(post("/emp/2"))
.andExpect(status().is(200))
.andExpect(content().contentType("application/json;charset=UTF-8"))
.andExpect(content().json("{\"id\":2,\"name\":\"员工二\",\"start_date\":1567699200000,\"salary\":12098.0,\"title\":\"Java开发工程师\"}"))
.andReturn();
//通过 mvcResult来获取数据
System.out.printf("本次请求响应的数据模型:%s",mvcResult.getResponse().getContentAsString());
}
注: 如果要对 json 数据进行断言,需要加入 jsonassert 依赖,如下 :
1 | <dependency> |
所涉及到的API
1
MockMvcBuilder // 用来构建 MockMvc 对象
1
MockMvcBuilders // 用来构建 MockMvcBuilder 对象
1
MockMvcRequestBuilders //用来构建各种不同类型的请求
1
MockMvcResultHandlers //针对响应结果的处理,主要是 log, print 操作
1
MockMvcResultMatchers // 针对响应结果的匹配